package cool.mylog.mylog2end.mapper;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cool.mylog.mylog2end.bean.Log;
import cool.mylog.mylog2end.bean.User;
import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 通过用户名查用户数，只会返回 0 或 1， 用于注册时的名称重复
     *
     * @param name 用户名
     * @return 用户ID，没有返回null
     */
    @Select("SELECT id FROM userlogin WHERE name=#{name} LIMIT 1")
    Long getUserIdByName(String name);

    //登录==============================================

    /**
     * 要先去login表里面看有没有这个用户，查到就返回用户ID
     * 然后再调查询用户信息接口
     *
     * @param name 用户名
     * @param pswd 密码
     * @return 用户ID，没有查到返回0
     */
    @Select("SELECT IFNULL(sum(id), 0) FROM userlogin WHERE name=#{name} AND pswd=SHA(#{pswd}) LIMIT 1")
    Long getUserByPswd(String name, String pswd) throws Error;

    // 查询用户信息 =======================================

    /**
     * 通过ID查询用户信息
     *
     * @param id 用户ID
     * @return 用户对象，没有返回null
     */
    @Select("SELECT * FROM user WHERE id=#{id} LIMIT 1")
    @ResultMap("userMap")
    User getUserById(long id);

    /**
     * 通过openidQ查用户id
     *
     * @param unionidQq 用户QQ的unionid
     * @return 用户ID，没有返回null
     */
    @Select("SELECT id FROM userlogin WHERE unionid_qq=#{unionidQq} LIMIT 1")
    Long getUserIdByUnionidQq(String unionidQq);

    /**
     * 通过openidQ查用户id
     *
     * @param userid 用户的unionid
     * @param platform qq
     * @param unionid 用户的unionid
     * @return 用户ID，没有返回null
     */
    @Update("UPDATE userlogin SET unionid_${platform} = '${unionid}' WHERE id = #{userid}")
    Integer bindPlatform(Long userid, String platform, String unionid);

    // 注册 ===============================================

    /**
     * 注册用户，密码表
     * 会修改user对象的id属性为id，返回的还是插入的行数
     *
     * @param user 用户对象
     * @return 插入的行数
     */
    @Insert("INSERT INTO userlogin (name, pswd) VALUES (#{name}, SHA(#{pswd}))")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    Integer insertUserLogin(User user);

    /**
     * 注册用户
     *
     * @param user 用户对象
     * @return 插入条数
     */
    Integer insertUser(User user);

    /**
     * 更新用户设置
     *
     * @param userid 用户id
     * @param setting 设置体对象
     * @return 影响的条数
     */
    @Update("UPDATE user SET setting = '${setting}' WHERE id = #{userid}")
    Integer updateSetting(long userid, JSONObject setting);

    /**
     * 更新用户openIdQ
     *
     * @param userid 用户id
     * @param openidQ 设置体对象
     * @return 影响的条数
     */
    @Update("UPDATE user SET openid_q = '${openIdQ}' WHERE id = #{userid}")
    Integer updateOpenidQ(long userid, String openidQ);

    /**
     * 编辑User
     *
     * @param user Log对象
     * @return 插入的行数
     */
    Integer updateUser(User user);
}
